#pragma once
#include <iostream>
using namespace std;


namespace gm
{
	template<class T>
	struct ListNode
	{
		ListNode<T>* _prev;
		ListNode<T>* _next;
		T _data;

		ListNode(const T& data = T())
			:_prev(nullptr)
			,_next(nullptr)
			,_data(data)
		{}


	};

	template<class T>
	struct __list_iterator
	{
		typedef ListNode<T> Node;
		typedef __list_iterator<T> iterator;
		Node* _node;

		__list_iterator(const Node* x)
			:_node(x)
		{}



	};

	template<class T>
	class list
	{
	public:
		typedef ListNode<T> Node;

		void empty_init()
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;
		}

		list()
		{
			empty_init();
		}



	private:
		Node* _head;
	};
}